package com.token.utils;

/**
 * @auther: henriy
 * @Date: 2023/11/29
 */
public class PrivacyUtil {

    /**
     * 隐藏手机号中间四位，$1是第一个小括号里的内容，$2是第二个小括号里面的内容，依此类推，表示的是：除第1、2个小括号的内容，其余全部打*码
     *
     * @param phone
     * @return
     */
    public static String hidePhone(String phone) {
        return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }

    /**
     * 隐藏邮箱
     *
     * @param email
     * @return
     */
    public static String hideEmail(String email) {
        return email.replaceAll("(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)", "$1****$3$4");
    }

    /**
     * 隐藏身份证
     *
     * @param idCard
     * @return
     */
    public static String hideIdCard(String idCard) {
        return idCard.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1*****$2");
    }

    /**
     * 隐藏银行卡
     *
     * @param bankCard
     * @return
     */
    public static String hideBankCard(String bankCard) {
        return bankCard.replaceAll("(\\d{6})\\d{6}(\\w{4})", "$1*****$2");
    }

    /**
     * 车辆识别代码，vin码（17位）
     *
     * @param vehicleVin
     * @return
     */
    public static String hideVehicleVin(String vehicleVin) {
        if (vehicleVin == null) {
            return null;
        }

        return desValue(vehicleVin, 5, 5, "*");
    }

    /**
     * 隐藏住址
     *
     * @param address
     * @return
     */
    public static String hideAddress(String address) {
        if (address == null) {
            return null;
        }

        return desValue(address, 2, 2, "*");
    }

    /**
     * 【中文姓名】只显示第一个汉字，其他隐藏为星号，比如：任**
     *
     * @param chineseName
     * @return
     */
    public static String hideChineseName(String chineseName) {
        if (chineseName == null) {
            return null;
        }

        return desValue(chineseName, 1, 0, "*");
    }

    /**
     * 对字符串进行脱敏操作
     *
     * @param origin          原始字符串
     * @param prefixNoMaskLen 左侧需要保留几位明文字段
     * @param suffixNoMaskLen 右侧需要保留几位明文字段
     * @param maskStr         用于遮罩的字符串, 如'*'
     * @return 脱敏后结果
     */
    public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) {
        if (origin == null) {
            return null;
        }

        StringBuilder sb = new StringBuilder();

        for (int i = 0, n = origin.length(); i < n; i++) {
            if (i < prefixNoMaskLen) {
                sb.append(origin.charAt(i));
                continue;
            }

            if (i > (n - suffixNoMaskLen - 1)) {
                sb.append(origin.charAt(i));
                continue;
            }

            sb.append(maskStr);
        }

        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(hideChineseName("张三三"));
    }
}
